/**
 * 给定X，构造数组满足：
 * 1. 数组的元素都是素数。
 * 2. 数组所有元素相乘恰好等于X
 * 3. 数组任意相邻两个元素不等
 * 用算术基本定理拆解X，然后看看因子数量是否满足条件
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;


struct Sieve{ // 线性筛法

using llt = long long;
vector<bool> isComp; // isComp[i]表示i是否为合数
vector<llt> primes; // primes[i]是第i个质数

Sieve(int SZ = 1E7){
    primes.reserve(SZ);
    isComp.assign(SZ, false);    

    long long tmp;
    for(int i=2;i<SZ;++i){
        if(!isComp[i]){
            primes.push_back(i);
        }

        for(int j=0,n=primes.size();j<n&&(tmp=i*(long long)primes[j])<SZ;++j){
            isComp[tmp] = true;

            if(0 == i % primes[j]){
                break;
            }else{

            }
        }
    }
}

}Sie;


using Real = long double;
using llt = long long;
using vi  =vector<int>;
using pii = pair<llt, int>;

llt X;

void proc(){
    if(1 == X) return (void)(cout<<"-1\n");

    int total = 0;
    int mx = 0;
    llt pm = 0;
    map<llt, int> cnt;
    for(auto p : Sie.primes){
        if(X % p == 0){
            int k = 0;
            while(X % p == 0) X /= p, ++k;
            cnt.insert({p, k});
            total += k;
            if(mx < k){
                mx = k;
                pm = p;
            }
            if(1 == X) break;
        }
    }
    if(X != 1) {
        cnt.insert({X, 1});
        total += 1;
        if(mx < 1){
            mx = 1;
            pm = X;
        }
    }
    int other = total - mx;
    if(other + 1 < mx) return (void)(cout << "-1\n");

    vector<pii> vec(cnt.begin(), cnt.end());
    sort(vec.begin(), vec.end(), [](const pii & a, const pii & b){
        if(a.second != b.second) return a.second > b.second;
        return a.first < b.first;
    });

    vector<llt> ans(total);
    int k = 0;
    for(const auto & p : vec){
        for(int i=0;i<p.second;++i){
            ans[k] = p.first;
            k += 2;
            if(k >= total) k = 1;
        }
    }
    for(int i=1;i<total;++i)assert(ans[i] != ans[i - 1]);
    cout << total << "\n";
    for(auto i : ans) cout << i << " ";
    cout << "\n";
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--){
        cin >> X;
        proc();
    }
    return 0;
}